#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <string>
#include <vector>
#include <thread>
using namespace std;

void* newthread(void* args)
{
    while(true)
    {
        cout << "I am new thread" << endl;
        sleep(1);
        int a = 10;
        a /= 0;
    }
    return nullptr;
}
int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, newthread, nullptr);
    //分离新线程
    pthread_detach(tid);
    while(true)
    {
        cout << "I am new thread" << endl;
        sleep(1);
    }
    return 0;
}

// void* newthread(void* args)
// {
//     int cnt = 5;
//     while(cnt)
//     {
//         cout << "I am new thread" << endl;
//         sleep(1);
//         cnt--;
//     }
//     return nullptr;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthread, nullptr);
//     //分离新线程
//     pthread_detach(tid);
//     while(true)
//     {
//         cout << "I am main thread" << endl;
//         sleep(1);
//     }

//     // cout << "thread wait block" << endl;
//     // pthread_join(tid, nullptr);
//     // cout << "thread wait return" << endl;
//     return 0;
// }

// void newthread(int num)
// {
//     while (true)
//     {
//         cout << "I am new thread-" << num << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     thread t1(newthread, 1);
//     thread t2(newthread, 2);
//     thread t3(newthread, 3);
//     while (true)
//     {
//         cout << "I am main thread-" << endl;
//         sleep(1);
//     }
//     t1.join();
//     t2.join();
//     t3.join();
//     return 0;
// }

// class Task
// {
// public:
//     Task()
//     {}
//     void SetData(int x, int y)
//     {
//         _x = x;
//         _y = y;
//     }
//     int Excute()
//     {
//         return _x + _y;
//     }
//     ~Task()
//     {}
// private:
//     int _x;
//     int _y;
// };
// class DataThread
// {
// public:
//     DataThread(int x, int y, const string& threadname)
//         :_threadname(threadname)
//     {
//         _t.SetData(x, y);
//     }
//     int run()
//     {
//         return _t.Excute();
//     }
//     string getName()
//     {
//         return _threadname;
//     }
//     ~DataThread()
//     {}
// private:
//     Task _t;
//     string _threadname;
// };
// const int threadnum = 5;
// void* taskthread(void* args)
// {
//     DataThread* td = static_cast<DataThread*>(args);
//     string threadname = td->getName();
//     int ret = td->run();
//     cout << threadname<<" ret is: " <<ret<<endl;
//     delete td;
//     return nullptr;
// }
// int main()
// {
//     vector<pthread_t> threads;
//     for(int i=0;i<threadnum;i++)
//     {
//         char threadname[64];
//         snprintf(threadname, sizeof(threadname), "thread-%d", i+1);
//         DataThread* td = new DataThread(10, 20, threadname);

//         pthread_t tid;
//         pthread_create(&tid, nullptr, taskthread, td);
//         threads.push_back(tid);
//     }

//     for(auto e:threads)
//     {
//         pthread_join(e, nullptr);
//     }
//     return 0;
// }

// const int threadnum = 5;
// void* taskthread(void* args)
// {
//     char* threadname = static_cast<char*>(args);
//     while(true)
//     {
//         cout << threadname << endl;
//         sleep(2);
//     }
//     delete []threadname;
//     return nullptr;
// }
// int main()
// {
//     vector<pthread_t> threads;
//     for(int i=0;i<threadnum;i++)
//     {
//         char* threadname = new char[64];
//         snprintf(threadname, 64, "thread-%d", i+1);

//         pthread_t tid;
//         pthread_create(&tid, nullptr, taskthread, threadname);
//         threads.push_back(tid);
//     }

//     for(auto e:threads)
//     {
//         pthread_join(e, nullptr);
//     }
//     return 0;
// }

// int g_val = 100;
// void *newthreadrun(void *args)
// {
//     string threadname = (char *)args;
//     int cnt = 1;
//     while (true)
//     {
//         printf("g_val: %d, &g_val: %p\n", g_val, &g_val);
//         sleep(1);
//         // if(cnt == 4)
//         // {
//         //     pthread_exit((void *)123);
//         // }
//         g_val++;
//         cnt++;
//     }
//     return (void *)123;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthreadrun, (void *)"thread-1");
//     int cnt = 1;
//     while (true)
//     {
//         printf("g_val: %d, &g_val: %p\n", g_val, &g_val);
//         sleep(1);
//         if(cnt == 4)
//         {
//             pthread_cancel(tid);
//         }
//         cnt++;
//     }
//     void *ret = nullptr;
//     int n = pthread_join(tid, &ret);
//     cout << "主线程退出..., n = " << n << " ret: " << (long long)ret << endl;
//     sleep(4);
//     return 0;
// }

// int g_val = 100;
// void *newthreadrun(void *args)
// {
//     string threadname = (char *)args;
//     int cnt = 1;
//     while (true)
//     {
//         printf("g_val: %d, &g_val: %p\n", g_val, &g_val);
//         sleep(1);
//         if(cnt == 5)
//         {
//             int* p = nullptr;
//             *p = 10;
//         }
//         g_val++;
//         cnt++;
//     }
//     return (void *)123;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthreadrun, (void *)"thread-1");
//     while (true)
//     {
//         printf("g_val: %d, &g_val: %p\n", g_val, &g_val);
//         sleep(1);
//     }
//     void *ret = nullptr;
//     int n = pthread_join(tid, &ret);
//     cout << "主线程退出..., n = " << n << " ret: " << (long long)ret << endl;
//     sleep(4);
//     return 0;
// }

// string Tohex(pthread_t tid)
// {
//     char id[1024];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }
// void* newthreadrun(void* args)
// {
//     string threadname = (char*)args;
//     int cnt = 5;
//     while(cnt)
//     {
//         cout << threadname<<" is new thread, cnt: "<<cnt <<" pid: "<< getpid()<<" threadid: "<<
//         Tohex(pthread_self())<< endl;
//         sleep(1);
//         cnt--;
//     }
//     return (void*)123;
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthreadrun, (void*)"thread-1");

//     void* ret = nullptr;
//     int n = pthread_join(tid, &ret);
//     cout << "主线程退出..., n = " << n <<" ret: "<<(long long)ret<< endl;
//     sleep(4);

//     // int cnt = 1;
//     // while(cnt)
//     // {
//     //     cout << "I am main thread, cnt: "<< cnt <<" pid: "<<getpid()<< " tid: "<<
//     //     Tohex(tid)<<" threadid: "<<Tohex(pthread_self())<<endl;
//     //     sleep(1);
//     //     cnt--;
//     // }
//     return 0;
// }